/*============================================================================*/
/*                        Tortoise Team			                              */
/*============================================================================*/
/*                        OBJECT SPECIFICATION                                */
/*============================================================================*
* C Source:         %HAL_Btn.c%
* Instance:         RPL_1
* %version:         1.0 %
* %created_by:      Andres Torres Garcia %
* %date_created:    Mon Oct 1 09:38:03 2012 %
*=============================================================================*/
/* DESCRIPTION : C source file for the hardware layer of the push button.     */
/*============================================================================*/
/* FUNCTION COMMENT : This file contains the functions definitions of the     */
/*					  hardware layer of the push button.                      */
/*                                                                            */
/*============================================================================*/
/*                               OBJECT HISTORY                               */
/*============================================================================*/
/*  REVISION |   DATE      |                               |      AUTHOR      */
/*----------------------------------------------------------------------------*/
/*  1.0      | 01/10/2012  |                               | Andres Torres    */
/* Integration under Continuus CM                                             */
/*============================================================================*/

/* Includes */
/* -------- */
#include "stdtypedef.h"
#include "MAL_pit.h"
#include "MAL_IOAPI.h"

/* Functions macros, constants, types and datas         */
/* ---------------------------------------------------- */
/* Functions macros */

/*==================================================*/ 
/* Definition of constants                          */
/*==================================================*/ 


/*======================================================*/ 
/* Definition of RAM variables                          */
/*======================================================*/ 

/*======================================================*/ 
/* close variable declaration sections                  */
/*======================================================*/ 

/* Private defines */

/* Private functions prototypes */
/* ---------------------------- */

void vfn_delay_2ms(void);

/* Exported functions prototypes */
/* ----------------------------- */

void vfnInit_Btn(T_UBYTE ub_btn);
T_UBYTE Check_Btn_Press(T_UBYTE ub_btn);

/* Inline functions */
/* ---------------- */

/* Private functions */
/* ----------------- */
/**************************************************************
 *  Name                 : 
 *  Description          :
 *  Parameters           :  [Input, Output, Input / output]
 *  Return               :
 *  Critical/explanation :    No
 **************************************************************/

/* Exported functions */
/* ------------------ */

/**************************************************************
 *  Name                 : 	vfn_delay_2ms
 *  Description          :	Creates a delay of 2 ms, using the PIT timer.
 *  Parameters           :  [Input, Output, Input / output]
 *  Return               :	void
 *  Critical/explanation :    No
 **************************************************************/
///////////////////////////////////////////////////////////////////////
/// \brief Creates a delay of 2 ms, using the PIT timer.
/////////////////////////////////////////////////////////////////////////
void vfn_delay_2ms(void)
{
	// Start timer
	PIT_EnablePITchannel(PIT_CHNL_0, TRUE);
	
	while(PIT.CH[(PIT_CHNL_0)].TFLG.B.TIF == 0);
	
	PIT_InterruptAck(PIT_CHNL_0);
}

/**************************************************************
 *  Name                 : 	vfnInit_Btn
 *  Description          :	Initialize the button.
 *  Parameters           :  [Input: ub_btn: Button to initialize, Output, Input / output]
 *  Return               :	void
 *  Critical/explanation :    No
 **************************************************************/
///////////////////////////////////////////////////////////////////////
/// \brief Initialize the button.
/// \param ub_btn Button to initialize.
/////////////////////////////////////////////////////////////////////////
void vfnInit_Btn(T_UBYTE ub_btn)
{
	IO_SetPinAsInput(ub_btn, 1);
	
	// Init and enable PIT module (All channels)
	vfnPIT_initModule();
	// Configure PIT channel cero to create an interrupt every 250 ms
	vfnPIT_init(PIT_CHNL_0,PERIOD_2MS);
}

/**************************************************************
 *  Name                 : 	Check_Btn_Press
 *  Description          :	Check if the button is pushed.
 *  Parameters           :  [Input, Output, Input / output]
 *  Return               :	T_UBYTE: Return 1 if it is pushed otherwise false.
 *  Critical/explanation :    No
 **************************************************************/
///////////////////////////////////////////////////////////////////////
/// \brief Check if the button is pushed.
/// \param ub_btn Button to check.
/// \return True if it is pushed, otherwise false.
/////////////////////////////////////////////////////////////////////////
T_UBYTE Check_Btn_Press(T_UBYTE ub_btn)
{
	if(IO_PinReadInput(ub_btn))
	{
		return 0;
	}
	
	vfn_delay_2ms();
	
	while(!IO_PinReadInput(ub_btn));
	
	vfn_delay_2ms();
	
	return 1;
}